package demo.topic12.introspector;

import org.junit.Test;

/**
 * 内省（Introspector）
 * 1. 概念：内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name，那我们可以通过getName/setName来获取值、设置值。
 * 通过getName/setName来访问name属性，这就是默认的规则。
 * 2. Java中提供了一套API来访问某个属性的getter/setter方法，通过这些API可以使那你不需要了解这个规则，这些API存放于包java.beans中，
 * 一般的做法是通过类Introspector的getBeanInfo方法来获取某个对象的BeanInfo信息，然后通过BeanInfo来获取属性的描述器（PropertyDescriptor），
 * 通过这个属性描述器就可以获取某个属性对应的getter/setter方法，然后我们就可以通过反射机制来调用这些方法。
 *
 * 3. Introspector类
 * （1）static BeanInfo getBeanInfo(Class<?>beanClass)
 *      在Java Bean上进行内省，了解其所有属性、公开的方法和事件
 * 4. BeanInfo类
 * （1）MethodDescriptor[] getMethodDescriptors()
 *      获得beans MethodDescriptor
 * （2）PropertyDescriptor[] getPropertyDescriptors()
 *      获得beans PropertyDescriptor
 * 5. PropertyDescriptor类
 * （1）PropertyDescriptor描述Java Bean通过一对存储器方法导出的一个属性
 * （2）Method getReadMethod()
 *      获得应该用于读取属性值的方法
 * （3）Method getWriteMethod()
 *      获得应该用于写入属性值的方法
 * 6. MethodDescriptor类
 * （1）描述Java Bean支持从其他组件对其进行外部访问
 * （2）Method getMethod()
 *      获得此MethodDescriptor封装的方法
 *
 */
public class IntrospectorDemo {
    @Test
    public void getBeanTest() {
        Config config = (Config) BeanFactory.getBean("bean.name");
        System.out.println(config.toString());   // Config{username='admin', password='123456', url='http:127.0.0.1:8080'}
    }
}
